/**
 * 云函数调用封装器
 * 统一处理token过期、用户不存在等认证相关错误
 */
import auth from './auth.js';

// Token过期或用户不存在的错误关键词
const AUTH_ERROR_KEYWORDS = [
  'document.get:fail document with _id',
  'does not exist',
  'token已过期',
  'token无效',
  '用户不存在',
  'unauthorized',
  'authentication failed',
  'invalid token',
  'token expired',
  'user not found',
  'access denied'
];

/**
 * 检查是否为认证相关错误
 * @param {string} errorMsg 错误信息
 * @returns {boolean} 是否为认证错误
 */
function isAuthError(errorMsg) {
  if (!errorMsg || typeof errorMsg !== 'string') {
    return false;
  }
  
  const lowerMsg = errorMsg.toLowerCase();
  return AUTH_ERROR_KEYWORDS.some(keyword => 
    lowerMsg.includes(keyword.toLowerCase())
  );
}

/**
 * 处理认证错误
 * @param {string} errorMsg 错误信息
 * @param {Object} options 配置选项
 */
function handleAuthError(errorMsg, options = {}) {
  const {
    showModal = true,
    autoLogout = true,
    redirectToLogin = true,
    customMessage = ''
  } = options;
  
  console.log('🔐 检测到认证错误:', errorMsg);
  
  if (autoLogout) {
    // 清除本地登录信息
    try {
      wx.removeStorageSync('access_token');
      wx.removeStorageSync('user_info');
      wx.removeStorageSync('login_type');
      console.log('🔐 已清除本地登录信息');
    } catch (error) {
      console.error('清除登录信息失败:', error);
    }
  }
  
  if (showModal) {
    const message = customMessage || '登录已过期，请重新登录';
    wx.showModal({
      title: '登录过期',
      content: message,
      showCancel: false,
      confirmText: '重新登录',
      success: (res) => {
        if (res.confirm && redirectToLogin) {
          // 获取当前页面路径作为登录后的跳转地址
          const pages = getCurrentPages();
          const currentPage = pages[pages.length - 1];
          const redirectUrl = currentPage ? `/${currentPage.route}` : '';
          
          auth.navigateToLogin(redirectUrl);
        }
      }
    });
  } else if (redirectToLogin) {
    // 不显示弹窗但直接跳转登录
    const pages = getCurrentPages();
    const currentPage = pages[pages.length - 1];
    const redirectUrl = currentPage ? `/${currentPage.route}` : '';
    
    auth.navigateToLogin(redirectUrl);
  }
}

/**
 * 封装的云函数调用方法
 * @param {Object} params 云函数调用参数
 * @param {Object} options 错误处理选项
 * @returns {Promise} 云函数调用结果
 */
export async function callCloudFunction(params, options = {}) {
  const {
    handleAuthErrors = true,
    showAuthModal = true,
    autoLogout = true,
    customAuthMessage = '',
    timeout = 15000
  } = options;
  
  try {
    // 自动添加token到请求参数
    const token = auth.getToken();
    if (token && params.data && !params.data.token) {
      params.data.token = token;
    }
    
    // 设置超时时间
    if (timeout && !params.timeout) {
      params.timeout = timeout;
    }
    
    console.log('☁️ 调用云函数:', params.name, params.data?.action || 'default');
    
    const result = await wx.cloud.callFunction(params);
    
    // 检查云函数调用是否成功
    if (result.errMsg && !result.errMsg.includes(':ok')) {
      throw new Error(`云函数调用失败: ${result.errMsg}`);
    }
    
    // 检查业务逻辑是否成功
    if (result.result) {
      // 检查是否为认证错误
      if (handleAuthErrors && result.result.error) {
        if (isAuthError(result.result.error)) {
          handleAuthError(result.result.error, {
            showModal: showAuthModal,
            autoLogout,
            customMessage: customAuthMessage
          });
          
          // 返回特殊的认证错误标识
          return {
            ...result,
            isAuthError: true,
            authErrorHandled: true
          };
        }
      }
      
      // 如果业务逻辑失败但不是认证错误，正常返回
      if (!result.result.success) {
        console.warn('⚠️ 云函数业务逻辑失败:', result.result.error || result.result.message);
      }
    }
    
    return result;
    
  } catch (error) {
    console.error('❌ 云函数调用异常:', error);
    
    // 检查异常信息是否包含认证错误
    if (handleAuthErrors && error.message && isAuthError(error.message)) {
      handleAuthError(error.message, {
        showModal: showAuthModal,
        autoLogout,
        customMessage: customAuthMessage
      });
      
      return {
        errMsg: 'cloud.callFunction:fail',
        result: {
          success: false,
          error: error.message,
          isAuthError: true,
          authErrorHandled: true
        }
      };
    }
    
    // 重新抛出非认证相关的错误
    throw error;
  }
}

/**
 * 快捷方法：调用用户管理相关云函数
 */
export async function callUserManagement(action, data = {}, options = {}) {
  return callCloudFunction({
    name: 'user-management',
    data: { action, ...data }
  }, {
    customAuthMessage: '用户信息已过期，请重新登录',
    ...options
  });
}

/**
 * 快捷方法：调用视频任务相关云函数
 */
export async function callVideoTask(action, data = {}, options = {}) {
  return callCloudFunction({
    name: 'video-task',
    data: { action, ...data }
  }, {
    customAuthMessage: '任务访问权限已过期，请重新登录',
    ...options
  });
}

/**
 * 快捷方法：调用积分管理相关云函数
 */
export async function callPointsManagement(action, data = {}, options = {}) {
  return callCloudFunction({
    name: 'points-management',
    data: { action, ...data }
  }, {
    customAuthMessage: '积分信息已过期，请重新登录',
    ...options
  });
}

/**
 * 快捷方法：调用邀请管理相关云函数
 */
export async function callInviteManagement(action, data = {}, options = {}) {
  return callCloudFunction({
    name: 'invite-management',
    data: { action, ...data }
  }, {
    customAuthMessage: '邀请管理权限已过期，请重新登录',
    ...options
  });
}

export default {
  callCloudFunction,
  callUserManagement,
  callVideoTask,
  callPointsManagement,
  callInviteManagement,
  isAuthError,
  handleAuthError
};
